package com.ideviu.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.Version;
import javax.xml.bind.annotation.XmlTransient;

import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;

@Entity
@Table(name = "NEG_NEGOCIOS")
public class Negocio extends BaseObject implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	private Long id;
    private String nombre;
    private String direccion;
	private User usuario;
	private String descripcion;
	//private TipoNegocio tipoNegocio;
	private String coordenadaX;
	private String coordenadaY;
	private String telefono;
	private String mail;
	private String facebook;
	private String twitter;
	private String logotipo;
	private String paginaWeb;
	private Integer version;
	private Set<Anuncio> setAnuncios = new HashSet<Anuncio>();
	
    @Id
    @Column(name = "NEG_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @SearchableId
	public Long getId() {
		return id;
	}
    public void setId(Long id) {
		this.id = id;
	}
    
    @Column(name = "NEG_NOMBRE", nullable = false, length = 256)
    @SearchableProperty
	public String getNombre() {
		return nombre;
	}
    public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	@Column(name = "NEG_DIRECCION", nullable = false, length = 256)
	public String getDireccion() {
		return direccion;
	}
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	
	@XmlTransient  // De esta forma indicaremos al webservice que no es necesario devolver la información del usuario para no acabar en un bucle...
	@ManyToOne
    @JoinColumn (name="USR_ID", updatable=true, insertable=true, nullable=false)
    public User getUsuario() {
        return usuario;
    }
	
	public void setUsuario(User usuario) {
		this.usuario = usuario;
	}
	
	@Column(name = "NEG_DESCRIPCION", length = 256)
	public String getDescripcion() {
		return descripcion;
	}
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	
	@Column(name = "NEG_COORDENADA_X", nullable = false, length = 50)
	public String getCoordenadaX() {
		return coordenadaX;
	}
	public void setCoordenadaX(String coordenadaX) {
		this.coordenadaX = coordenadaX;
	}
	
	@Column(name = "NEG_COORDENADA_Y", nullable = false, length = 50)
	public String getCoordenadaY() {
		return coordenadaY;
	}
	public void setCoordenadaY(String coordenadaY) {
		this.coordenadaY = coordenadaY;
	}
	
	@Column(name = "NEG_TELEFONO", length = 50)
	public String getTelefono() {
		return telefono;
	}
	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}
	
	@Column(name = "NEG_MAIL", length = 50)
	public String getMail() {
		return mail;
	}
	public void setMail(String mail) {
		this.mail = mail;
	}
	
	@Column(name = "NEG_FACEBOOOK", length = 50)
	public String getFacebook() {
		return facebook;
	}
	public void setFacebook(String facebook) {
		this.facebook = facebook;
	}
	
	@Column(name = "NEG_TWITTER", length = 50)
	public String getTwitter() {
		return twitter;
	}
	public void setTwitter(String twitter) {
		this.twitter = twitter;
	}
	
	@Column(name = "NEG_LOGOTIPO", length = 256)
	public String getLogotipo() {
		return logotipo;
	}
	public void setLogotipo(String logotipo) {
		this.logotipo = logotipo;
	}
	
	@Column(name = "NEG_PAGINA_WEB", length = 256)
	public String getPaginaWeb() {
		return paginaWeb;
	}
	public void setPaginaWeb(String paginaWeb) {
		this.paginaWeb = paginaWeb;
	}
	
	@Version
	@Column(name = "NEG_VERSION")
	public Integer getVersion() {
		return version;
	}
	public void setVersion(Integer version) {
		this.version = version;
	}
	@Override
	public String toString() {
		return "Negocio [id=" + id + ", nombre=" + nombre + ", direccion="
				+ direccion + ", usuario=" + usuario + ", descripcion="
				+ descripcion + ", coordenadaX=" + coordenadaX
				+ ", coordenadaY=" + coordenadaY + ", telefono=" + telefono
				+ ", mail=" + mail + ", facebook=" + facebook + ", twitter="
				+ twitter + ", logotipo=" + logotipo + ", paginaWeb="
				+ paginaWeb + ", version=" + version + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((coordenadaX == null) ? 0 : coordenadaX.hashCode());
		result = prime * result
				+ ((coordenadaY == null) ? 0 : coordenadaY.hashCode());
		result = prime * result
				+ ((descripcion == null) ? 0 : descripcion.hashCode());
		result = prime * result
				+ ((direccion == null) ? 0 : direccion.hashCode());
		result = prime * result
				+ ((facebook == null) ? 0 : facebook.hashCode());
		result = prime * result
				+ ((logotipo == null) ? 0 : logotipo.hashCode());
		result = prime * result + ((mail == null) ? 0 : mail.hashCode());
		result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
		result = prime * result
				+ ((paginaWeb == null) ? 0 : paginaWeb.hashCode());
		result = prime * result
				+ ((telefono == null) ? 0 : telefono.hashCode());
		result = prime * result + ((twitter == null) ? 0 : twitter.hashCode());
		result = prime * result + ((usuario == null) ? 0 : usuario.hashCode());
		result = prime * result + ((version == null) ? 0 : version.hashCode());
		return result;
	}
	
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Negocio other = (Negocio) obj;
		if (coordenadaX == null) {
			if (other.coordenadaX != null)
				return false;
		} else if (!coordenadaX.equals(other.coordenadaX))
			return false;
		if (coordenadaY == null) {
			if (other.coordenadaY != null)
				return false;
		} else if (!coordenadaY.equals(other.coordenadaY))
			return false;
		if (descripcion == null) {
			if (other.descripcion != null)
				return false;
		} else if (!descripcion.equals(other.descripcion))
			return false;
		if (direccion == null) {
			if (other.direccion != null)
				return false;
		} else if (!direccion.equals(other.direccion))
			return false;
		if (facebook == null) {
			if (other.facebook != null)
				return false;
		} else if (!facebook.equals(other.facebook))
			return false;
		if (logotipo == null) {
			if (other.logotipo != null)
				return false;
		} else if (!logotipo.equals(other.logotipo))
			return false;
		if (mail == null) {
			if (other.mail != null)
				return false;
		} else if (!mail.equals(other.mail))
			return false;
		if (nombre == null) {
			if (other.nombre != null)
				return false;
		} else if (!nombre.equals(other.nombre))
			return false;
		if (paginaWeb == null) {
			if (other.paginaWeb != null)
				return false;
		} else if (!paginaWeb.equals(other.paginaWeb))
			return false;
		if (telefono == null) {
			if (other.telefono != null)
				return false;
		} else if (!telefono.equals(other.telefono))
			return false;
		if (twitter == null) {
			if (other.twitter != null)
				return false;
		} else if (!twitter.equals(other.twitter))
			return false;
		if (usuario == null) {
			if (other.usuario != null)
				return false;
		} else if (!usuario.equals(other.usuario))
			return false;
		if (version == null) {
			if (other.version != null)
				return false;
		} else if (!version.equals(other.version))
			return false;
		return true;
	}
	
    /** ANUNCIOS ASOCIADOS AL NEGOCIO **/
    
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="negocio")
    public Set<Anuncio> getSetAnuncios() {
        return setAnuncios;
    }
   
    public void setSetAnuncios(Set<Anuncio> setAnuncios) {
		this.setAnuncios = setAnuncios;
	}

	/**
     * A�ade un nuevo negocio al set de negocios asociados al usuario
     *
     * @param negocio
     */
    public void addAnuncio(Anuncio anuncio) {
    	anuncio.setNegocio(this);
        getSetAnuncios().add(anuncio);
    }
    
    public void removeAnuncio(Anuncio anuncio) {
    	anuncio.setNegocio(this);
        getSetAnuncios().remove(anuncio);
    }
    
    /**
     * Convierte el set de negocios a LabelValue objects.
     *
     * @return a lista de LabelValue objects con la informaci�n de los negocios.
     */
    @Transient
    public List<LabelValue> getAnunciosList() {
        List<LabelValue> negocioAnuncios = new ArrayList<LabelValue>();

        if (this.setAnuncios != null) {
            for (Anuncio anuncio : setAnuncios) {
            	negocioAnuncios.add(new LabelValue(anuncio.getNombre(), anuncio.getNombre()));
            }
        }

        return negocioAnuncios;
    }

}